package src.DisciplesPlan.链表;

/**
 * 给你一个链表的头节点 head ，旋转链表，将链表每个节点向右移动 k 个位置。

  

 示例 1：


 输入：head = [1,2,3,4,5], k = 2
 输出：[4,5,1,2,3]
 示例 2：


 输入：head = [0,1,2], k = 4
 输出：[2,0,1]
 */

public class _61旋转链表 {
    public static ListNode rotateRight(ListNode head, int k) {
        // 校验合法性
        if (head == null) {
            return null;
        }
        // 链表长度
        int length = 1;
        // 遍历指针
        ListNode p = head;
        // 计算链表长度
        while (p.next != null) {
            p = p.next;
            length++;
        }
        // 将最后一个结点连接到头结点，成环
        p.next = head;
        // 考虑k远大于链表长度的情况
        k %= length;
        k = length - k;
        // 要位移的距离
        for (int i = 0 ; i < k ; i++) {
            p = p.next;
        }
        // 标记新链表的头结点
        head = p.next;
        // 将当前结点的下一个结点置空
        p.next = null;
        return head;
    }
}
